# pip3 install pycryptodome
# pip3 install crypto
# Pip3 install pycrypto

# pycrypto、pycrytodome和crypto是一个东西，crypto在python上面的名字是pycrypto，它是一个第三方库，但是已经停止更新三年了，所以不建议安装这个库；
# 1.windows下python3.6安装也不会成功！
# 这个时候pycryptodome就来了，它是pycrypto的延伸版本，用法和pycrypto是一模一样的；
# 所以，我现在告诉大家一种解决方法–直接安装：pip install pycryptodome
# 2.但是，在使用的时候导入模块是有问题的，这个时候只要修改一个文件夹的名称就可以完>美解决这个问题，
# Python\Python36\Lib\site-packages，找到这个路径，下面有一个文件夹叫做crypto,将小写c改成大写C就ok了。
# 我在我的linux生产环境上，版本是3.6，直接安装pycryptodome，第三方目录下的包直接就>是：Crypto、pycryptodome-3.6.6.dist-info，连名字都不用改。


# 私钥加密不支持
# 私钥签名不支持java

from Crypto import Random
from Crypto.Hash import SHA256
from Crypto.PublicKey import RSA


# 伪随机数生成器
from Crypto.Signature import PKCS1_PSS

random_generator = Random.new().read
# rsa算法生成实例
rsa = RSA.generate(1024, random_generator)

# master的秘钥对的生成
private_pem = rsa.exportKey()

#--------------------------------------------生成公私钥对文件-----------------------------------------------------------
# with open('master-private.pem', 'wb') as f:
#     f.write(private_pem)
#
# public_pem = rsa.publickey().exportKey()
# with open('master-public.pem', 'wb') as f:
#     f.write(public_pem)

from Crypto.Cipher import PKCS1_v1_5 as Cipher_pkcs1_v1_5
import base64

def Rsa256_sign_data(data, rsa_key):
    try:
        h = SHA256.new(data.encode("utf8"))
        rsa_sign = PKCS1_PSS.new(rsa_key)
        # new(rsa_key, mgfunc=None, saltLen=None, randfunc=None)
        if rsa_sign.can_sign():
            return rsa_sign.sign(h)
        else:
            raise Exception
    except Exception as err:
        raise err
    return signature


def Rsa256_verify_data(data, sig, rsa_key):
    try:
        h = SHA256.new(data.encode("utf8"))
        return PKCS1_PSS.new(rsa_key).verify(h, sig)
    except Exception as err:
        print("RSA verify fail", '', err)
        return False

message = 'hello ghost, this is a plian text'
with open('public_key.pem', "r") as f:
     key = f.read()
     publicKey = RSA.importKey(key)  # 导入读取到的公钥
     cipher = Cipher_pkcs1_v1_5.new(publicKey)  # 生成对象
     cipher_text = base64.b64encode(cipher.encrypt(message.encode(encoding="utf-8")))  # 通过生成的对象加密message明文，注意，在python3中加密的数据必须是bytes类型的数据，不能是str类型的数据
     print("公钥加密")
     print(str(cipher_text, "utf8"))


with open('private_key.pem') as f:
    key = f.read()
    privateKey = RSA.importKey(key)  # 导入读取到的私钥
    cipher = Cipher_pkcs1_v1_5.new(privateKey)  # 生成对象
    text = cipher.decrypt(base64.b64decode(cipher_text), "ERROR")  # 将密文解密成明文，返回的是一个bytes类型数据，需要自己转换成str
    print("私钥解密")
    print(text.decode("utf-8"))

# 每次签名的字符串还不一样
# 真是醉了， java那边验证不了
signStr = Rsa256_sign_data("中国", privateKey)
print(str(base64.b64encode(signStr), "UTF-8"))
print(Rsa256_verify_data("中国", signStr, publicKey))








